#include "key.h"
//#include "buzz.h"

struct _key_t _key[] = {
	{GPIOC, GPIO_PIN_2, GPIO_PIN_RESET},
};

int keynum = sizeof(_key) / sizeof(struct _key_t); 

/**
 * @brief  初始化按键
 * @param  
 * @retval 无
 */
void key_init(void)
{
	for(int i=0; i < keynum; i++) {
		if (_key[i].downState == GPIO_PIN_SET) {
			_key[i].lastState = GPIO_PIN_RESET;	//检测下降沿，假设上电前按键工作在高电平
			_key[i].upState 	= GPIO_PIN_RESET;
		} else {
			_key[i].lastState = GPIO_PIN_SET;	//检测下降沿，假设上电前按键工作在高电平
			_key[i].upState 	= GPIO_PIN_SET;
		}
		
		_key[i].downFlag = 0;							//没有按下过
	}	
}

/**
 * @brief  按键数据更新
 * @param  
 * @retval 无
 */
void key_update(void)
{
	for(int i=0; i < keynum; i++) {
		
		//获取按键状态
		GPIO_PinState nowGPIO_State = HAL_GPIO_ReadPin(_key[i].GPIOx, _key[i].GPIO_PINx);
		
		if (nowGPIO_State == _key[i].downState && _key[i].lastState == _key[i].upState) {	//上一时刻是高电平，这一时刻是低电平则视为按下
			_key[i].downFlag = 1;							//按下过按键标志位
		}
		
		/* 更新按键状态 */
		_key[i].lastState = nowGPIO_State;
	}	
}

/**
 * @brief  获取按键按下状态
 * @param  0没有按下		1按下过
 * @retval 无
 */
uint8_t getkey(uint8_t getkeynum)
{
	if (getkeynum >= keynum) {
		return -1;
	}
	
	/* 记录按键按下过的状态 */
	GPIO_PinState downFlag = _key[getkeynum].downFlag;
	
	/*清除按键按下过的状态*/
	_key[getkeynum].downFlag = 0;
	
	/*返回按键按下过的状态*/
	return downFlag;
}

/**
 * @brief  获取按键状态
 * @param  
 * @retval 无
 */
uint8_t getkey_state(uint8_t getkeynum)
{
	if (getkeynum > keynum) {
		return -1;
	}
	
	return HAL_GPIO_ReadPin(_key[getkeynum].GPIOx, _key[getkeynum].GPIO_PINx);
}

/******************* (C) COPYRIGHT 2023 LIUGHONG*****END OF FILE************/
